// 闭包：函数在执行的时候回在放在一个执行栈上执行，当函数执行完毕之后就会从执行栈上移除，但是堆上的作用域成员因为被外部应用不能释放，就形成了闭包
// 闭包：在另一个作用域中调用一个函数的内部函数并访问到该函数作用域中的成员

// 返回的函数可以共享一些数据
function once(fn) {
  let flag = false;
  return function () {
    if (!flag) {
      flag = true;
      fn.apply(this, arguments);
    }
  };
}

const pay = once((money) => {
  console.log('money==>', money);
});

// 闭包：在另一个作用域中调用一个函数的内部函数并访问到该函数作用域中的成员
// 在主环境中调用 pay函数能访问到once函数作用域中的成员
pay(1);
pay(2);
pay(3);
